package gui;


import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;

import mapelements.Renderer;

/** SelectionBox non è altro che una finestra di selezione dei
 *  renderer disponibili. Contiene un elenco di renderer, ciascuno
 *  corredato con un componente dipinto di esempio.
 * @author Daniele
 * @version 2.0 */
public class SelectionBox extends JPanel implements MouseListener{
	
	//FORDANI Mi piacerebbe che il messaggio NO_ENTRIES fosse centrato nella SelectionBox...
	//FORDANI Quando un'entry è selezionata, fa' in modo che risulti evidenziata.
	
	private static final long serialVersionUID = 7512662277831197002L;
	
	/** La scritta che si presenta nel caso non ci siano entries. */
	private static final String NO_ENTRIES = "No available entries.";
	
	/** Il layout utilizzato per disporre i vari BoxElement in colonna. */
	private BoxLayout layout;
	
	/** Costruisce una finestra di selezione dei renderer o dei concepts disponibili. */
	public SelectionBox(){
		super();
		layout = new BoxLayout(this,BoxLayout.Y_AXIS);
		this.setLayout(layout);
		this.add(new JLabel(NO_ENTRIES));
	}
	
	//TODO la storia del conceptOrRenderer secondo me potrebbe essere evitata... in quale modo non saprei :P
	
	/** Aggiunge una nuova entry nell'elenco.
	 * @param _description la descrizione che si vuole dare alla entry.
	 * @param _renderer    la classe che rappresenta il renderer 
	 */
	public void addEntry(String _description,Class _clazz, Renderer _renderer){
		if(this.getComponent(0) instanceof JLabel){
			this.removeAll();
		}
		BoxElement newEntry = new BoxElement(_description,_clazz,_renderer);
		this.add(newEntry);
		newEntry.addMouseListener(this);
	}
	public void addEntry(String _description,Class _clazz){
		if(this.getComponent(0) instanceof JLabel){
			this.removeAll();
		}
		BoxElement newEntry = new BoxElement(_description,_clazz);
		this.add(newEntry);
		newEntry.addMouseListener(this);
	}
	
	/** Rimuove tutte le entries presenti nell'elenco. */
	public void removeAllEntries(){
		this.removeAll();
		this.add(new JLabel(NO_ENTRIES));
	}
	
	public void paintBorder(Graphics g){
		Dimension size = this.getSize();
		Border border = BorderFactory.createEtchedBorder();
		border.paintBorder(this, g, 0, 0, size.width, size.height);
		super.paintBorder(g);
	}
	
	@Override
	/** Quando il mouse clicca su un componente BoxElement del RendererBox, questo
	 *  metodo risale al componente BoxElement tramite MouseEvent.getComponent().
	 *  Poi il metodo findEntry di questa Classe confronta il nome del componente
	 *  catturato con quello delle varie entries nel Vector e trova l'indice esatto. */
	public void mouseClicked(MouseEvent e) {
		for (MouseListener l : this.getMouseListeners()){
			l.mouseClicked(e);
		}
	}
	
	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
}
